package com.xie.authority_system.utils;

import com.xie.authority_system.entity.Permission;
import com.xie.authority_system.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author 谢金成
 * @date 2024/1/16 17:36
 */
public class MenuTree {

    /**
     * 生成路由
     *
     * @param menuList 菜单列表
     * @param pid      父菜单ID
     * @return
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList, Long pid) {
        // 创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<>();
        // 判断菜单列表是否为空, 如果不为空, 则使用菜单列表, 否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(item -> item!=null && Objects.equals(item.getParentId(), pid))
                .forEach(item -> {
                    // 创建路由信息
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());
                    routerVo.setPath(item.getPath());
                    // 判断当前菜单是否是一级菜单
                    if (item.getParentId() == 0L) {
                        routerVo.setComponent("Layout"); // 一级菜单
                        routerVo.setAlwaysShow(true); // 显示路由
                    } else {
                        routerVo.setComponent(item.getUrl()); // 具体的某个组件
                        routerVo.setAlwaysShow(false); // 折叠路由
                    }
                    // 设置Meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(), item.getIcon(), item.getCode().split(",")));
                    // 递归生成路由
                    List<RouterVo> children = makeRouter(menuList, item.getId()); // 子菜单
                    routerVo.setChildren(children); // 设置子路由到路由对象中
                    // 将路由信息放入路由集合中
                    routerVoList.add(routerVo);
                });

        // 返回路由信息
        return routerVoList;
    }

    /**
     * 生成菜单树
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList, Long pid) {
        // 创建集合保存菜单数据
        List<Permission> permissionList = new ArrayList<>();
        // 判断菜单列表是否为空, 如果不为空则使用菜单列表,否则创建一个新集合
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(item -> item != null && Objects.equals(item.getParentId(), pid))
                .forEach(item -> {
                    // 创建菜单
                    Permission permission = new Permission();
                    // 将原有的属性复制个菜单对象
                    BeanUtils.copyProperties(item, permission);
                    // 获取每项的子菜单, 递归生成菜单树
                    List<Permission> children = makeMenuTree(menuList, item.getId());
                    // 设置子菜单
                    permission.setChildren(children);
                    // 将菜单对象添加到集合
                    permissionList.add(permission);
                });

        // 返回菜单信息
        return permissionList;
    }
}
